/**
 * 取模与取余
 *   a = 4 , b = -3
 * 第一步： 4/(-3) = -1.333...3..3(无限循环)
 *   对于取模运算，得到的整数商将为-2（向负无穷取整）
 *   对于取余运算，得到的整数商将为-1（向0取整）
 *   取模结果为 c = -2
 *   取余结果为 c = -1
 * 第二步：
 *   对于取模运算，r = 4 - ((-2) * (-3)) = -2
 *   对于取余运算，r = 4 - ((-1) * (-3)) = 1
 *   故，取模结果为-2，取余结果为1。
 * 
 * 
 * 最佳实践
 *   operator%如果可能，最好将余数运算符 ( ) 的结果与 0 进行比较。
 * 
 * 指数运算符在哪里
 *   ^运算符（通常用于表示数学中的求幂）是C++ 中的按位异或运算
 *   要在 C++ 中计算指数，请 #include <cmath> 头文件，并使用 pow() 函数
 *   请注意，函数 pow() 的参数（和返回值）是 double 类型。由于浮点数的舍入误差，pow() 的结果可能不精确（即使您传递整数或整数）。
 * 
 * 在绝大多数情况下，整数求幂会使整数类型溢出。这可能就是为什么这样的函数最初没有包含在标准库中的原因。
 * 
 */

#include <cassert> // for assert
#include <cstdint> // for std::int64_t
#include <iostream>
#include <cmath>

// note: exp must be non-negative
// note: does not perform range/overflow checking, use with caution
constexpr std::int64_t powint(std::int64_t base, int exp)
{
	assert(exp >= 0 && "powint: exp parameter has negative value");

	// Handle 0 case
	if (base == 0)
		return (exp == 0) ? 1 : 0;

	std::int64_t result{ 1 };
	while (exp > 0)
	{
		if (exp & 1)  // if exp is odd
			result *= base;
		exp /= 2;
		base *= base;
	}

	return result;
}

int main()
{
	std::cout << powint(7, 12) << '\n'; // 7 to the 12th power
    std::cout << pow(7, 12) << "\n";

	return 0;
}